package com.jfm.jfmm.collector.driver;

import com.jfm.jfmm.collector.entity.collect.*;
import com.jfm.jfmm.collector.entity.device.Device;
import com.jfm.jfmm.collector.entity.template.CollectTemplate;
import com.jfm.jfmm.collector.entity.template.SNMP;
import com.jfm.jfmm.collector.enums.CollectorProtocol;
import com.jfm.jfmm.utils.SHA256Util;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author DYang
 * @since 2024-10-08 23:14
 * 数据采集驱动接口
 */
public interface ACollectorDriver<P,R> {

    /**
     * 初始化将采集器到容器
     */
    Map<CollectorProtocol,ACollectorDriver<?,?>> collectorMap = new HashMap<>();

    /**
     * 注册采集器
     */
    void register();

    /**
     * 预检查
     * @param param 请求参数
     * @return
     */
    CheckResult perCheck(Param param);

    /**
     * 可用性测试
     */
    boolean isAvailable(Param param);

    /**
     * 支持的协议
     * @return
     */
    CollectorProtocol supportProtocol();

    /**
     * 采集数据
     * @param param
     * @return
     */
    CollectResult collect(Param param);

    /**
     * 通过驱动协议获取采集器
     * @param protocol 协议
     * @return
     */
    static ACollectorDriver<?,?> getDriver(CollectorProtocol protocol){
        return collectorMap.get(protocol);
    }

    /**
     * 构建采集参数
     * @param device   设备信息
     * @param template 模板信息
     * @return
     */
    List<CollectParam> buildCollectParam(Device device,CollectTemplate template);

    /**
     * 转换输入参数
     * @param reqParam
     * @return
     */
    P transformParam(Param reqParam);

    /**
     * 转换结果
     * @param result
     * @return
     */
    default R transformResult(Result result){
        return null;
    }


    /**
     * 获取时间单位
     * @param timeUnit
     * @return
     */
    default TimeUnit getTimeUnit(String timeUnit){
        if ( timeUnit == null) {
            return TimeUnit.SECONDS;
        }else {
            return switch (timeUnit){
                case "m" -> TimeUnit.MINUTES;
                case "h" -> TimeUnit.HOURS;
                case "d" -> TimeUnit.DAYS;
                default -> TimeUnit.SECONDS;
            };
        }
    }

    /**
     * 构建metricId
     * @param device 设备信息
     * @param item   采集项信息
     * @return
     */
    default String buildSpanId(Device device, SNMP.Item item){
        String height = SHA256Util.getSHA256Str(device.getCode(), 6);
        String low = SHA256Util.getSHA256Str(item.getCode(), 4);
        return height + low;
    }

    /**
     * 转换采集值
     * @param value     采集值
     * @param dataType  数据转换
     * @return
     */
    default Object transformValue(String value, String dataType){
        if (value == null || dataType == null) {
            return value;
        }
        return switch (dataType){
            case "int" -> Integer.parseInt(value);
            case "long" -> Long.parseLong(value);
            case "float" -> Float.parseFloat(value);
            case "double" -> Double.parseDouble(value);
            default -> value;
        };
    }
}
